<?php

require_once 'mysqli_connect.php';
require_once 'logging.php';
require_once 'memcache.php';

global $tienda, $log;


$log->debug("En modelo.php");

if ($memcache) {
    $tienda = $memcache->get('tienda');
}

if (!$tienda) {
    $tienda = Tienda::getInstance();
    if ($memcache) {
        $memcache->set('tienda', $tienda, 0) or $log->debug("No se ha podido almacenar la tienda");
    }
}

class Articulo {

    public $idArticulo;
    public $precioArticulo;
    public $nombreArticulo;

    function __construct($idArticulo, $nombreArticulo, $precioArticulo) {
        $this->idArticulo = $idArticulo;
        $this->nombreArticulo = $nombreArticulo;
        $this->precioArticulo = $precioArticulo;
    }

}

class Tienda {

    private static $tienda = null;
    public $nombre = "dawPC";
    public $categorias = null;

    public static function getInstance() {
        global $log;
        if (self::$tienda == null) {
            $log->debug("getInstance() Creando una tienda");
            self::$tienda = new Tienda();
        }
        return self::$tienda;
    }

    public function __construct() {
        global $log;
        $log->debug("__construct() Creando una tienda");
        //Suponemos que las categorías no cambian casi nunca con lo que podemos ahorrarnos tener que buscarlas en la BD        
        $this->loadCategorias();
    }

    public function loadCategorias() {
        global $log, $mysqli;
        $log->debug("en loadCategorias");
        $sql = "SELECT * FROM `Categorias`";
        $resulset = $mysqli->query($sql);
        $this->categorias = array();
        while ($categoria = $resulset->fetch_assoc()) {
            $this->categorias[] = array_map('utf8_encode', $categoria);
        }
    }

    public function getCategorias() {
        return $this->categorias;
    }

    //No es necesario un atributo artículos ya que los recuperamos directamente de la base de datos
    public function getArticulos($idCategoria) {
        global $log, $mysqli;
        $sql = "SELECT * FROM `Articulos` WHERE `idCategoria` = $idCategoria";
        $resulset = $mysqli->query($sql);
        $articulos = array();
        while ($articulo = $resulset->fetch_assoc()) {
            $articulos[] = array_map('utf8_encode', $articulo);
        }        
        return $articulos;
    }

    public function getArticulo($idArticulo) {
        global $log;
        global $mysqli;
        //$log->debug("En modelo.php aqui1");
        $articulo = null;
        $sql = "SELECT * FROM Articulos WHERE idArticulo=$idArticulo";
        $resulset = $mysqli->query($sql);
        //$log->debug("En modelo.php aqui2");
        //$log->debug("$sql");
        $row = $resulset->fetch_array();
        if ($row) {
            $articulo = new Articulo($row['idArticulo'], $row['nombreArticulo'], $row['precioArticulo']);
        }
        return $articulo;
    }

    public function comprar($articulos, $msg) {
        global $log;
        global $mysqli;

        $idUser = $_SESSION['user']['idUsuario'];
        if (isset($articulos) && count($articulos) > 0) {
            $sql = "INSERT INTO Pedidos(idUsuario) VALUES ('$idUser')";
            $rdo = $mysqli->query($sql);
            if ($rdo) {
                $idPedido = $mysqli->insert_id;
                for ($i = 0; $i < count($articulos); $i++) {
                    $linea = $articulos[$i];
                    $idArticulo = $mysqli->real_escape_string($linea->idArticulo);
                    $cantidadArticulo = $mysqli->real_escape_string($linea->cantidadArticulo);
                    //$log->debug("En comprar.php aqui1");                    
                    /* $class_methods = get_class_methods($this);
                      foreach ($class_methods as $method_name) {
                      $log->debug("en comprar.php metodo: $method_name");
                      } */
                    //$log->debug("En comprar.php aqui2 $idArticulo");
                    $articulo = $this->getArticulo($idArticulo);
                    if ($articulo != null) {
                        $precioArticulo = $articulo->precioArticulo;
                        if (ctype_digit(strval($cantidadArticulo)) && $cantidadArticulo > 0) {

                            $ordenLinea = $i + 1;
                            $sql = "INSERT INTO PedidoLineas(idPedido, ordenLinea, idArticulo, cantidadArticulo, precioArticulo) VALUES ($idPedido, $ordenLinea, $idArticulo, $cantidadArticulo, $precioArticulo)";
                            $rdo = $mysqli->query($sql);
                            if (!$rdo) {
                                $sqlError = $mysqli->error();
                                throw new SQLError("No se ha podido almacenar el pedido", $sqlError, $sql);
                            }
                        } else {
                            throw new DAWPCError("La cantidad '$cantidadArticulo' del artículo '{$articulo->nombreArticulo}' debe ser un número válido");
                        }
                    } else {
                        throw new DAWPCError("El artículo con id '$idArticulo' no existe en la base de datos");
                    }
                    //$log->debug("En comprar.php aqui3");
                    //$articulo = getArticulo($idArticulo);
                    //$idArticulo = $articulo['idArticulo'];
                }
                $msg->resultado = true;
                $msg->mensaje = "Su número de pedido es el $idPedido";
            } else {
                $msg->mensaje = "No se ha podido almacenar el pedido. Error desconocido. SQL = $sql";
                $sqlError = $mysqli->error();
                throw new SQLError("No se ha podido almacenar el pedido", $sqlError, $sql);
            }
        } else {
            $msg->mensaje = "No se ha recibido ningún articulo que comprar";
        }
        return $msg;
    }

    public function __toString() {
        return $this->nombre;
    }

}

?>
